// 冻结(freeze)对象

const x = Object.create(null, {
    id: { value: 1001, enumerable: true, writable: true, configurable: true },
    name: { value: '阿芳', enumerable: true, writable: true, configurable: true }
});

console.log( x );

// Object.isFrozen( object )
// 作用: 判断指定对象(object)是否被冻结
// 返回: 仅当指定对象已经被冻结时返回 true
console.log( Object.isFrozen( x ) ); // false

// Object.freeze( object )
// 作用: 冻结指定对象(object)
// 返回: 返回被冻结的对象(即参数传入的对象)
let y = Object.freeze(x);
console.log( y === x ); // true

// 被冻结的对象不能被扩展
try {
    x.gender = '女士'; // 虽未抛异常但执行失败
    Object.defineProperty(x, 'hometown', { value: '兰州', enumerable: true, writable: true, configurable: true } );
    console.log( x );
} catch (e){
    console.log('被冻结的对象不能被扩展');
    console.log( e.name, e.message );
}

// 被冻结的对象不可被配置
try {
    // 配置: 动态删除属性
    delete x.id; // 虽未抛异常但操作失败
    // 配置: 修改属性描述符
    Object.defineProperty(x, 'hometown', { value: '金城兰州', enumerable: true, writable: false, configurable: false } );
} catch (e) {
    console.log('被冻结的对象不能被配置');
    console.log( e.name, e.message );
}


// 修改: 替换属性值
x.name = '李小芳'; // 虽不抛异常但操作失败
console.log( x );